/* ========================================
 *
 * Copyright Nano IC, 2021-02-25
 * All Rights Reserved
 * UNPUBLISHED, LICENSED SOFTWARE.
 *
 * CONFIDENTIAL AND PROPRIETARY INFORMATION
 * WHICH IS THE PROPERTY OF Nano IC.
 *
 * ========================================
*/
#ifndef  __ONE_WIRE_BUS_TRA_H__
#define  __ONE_WIRE_BUS_TRA_H__
#include "one_wire_bus_phy.h"


#define  ONE_WIRE_SOURCE_DATA_LEN        240
#define  ONE_WIRE_COVERT_DATA_LEN        ONE_WIRE_SOURCE_DATA_LEN+6 //(((ONE_WIRE_SOURCE_DATA_LEN + 5) * 4) / 3)
/**
 * 源数据包数据结构
*/
typedef struct source_packet_struct
{

	uint8_t sid;        // Service ID
    uint8_t cid;        // Command ID
    uint8_t data[ONE_WIRE_SOURCE_DATA_LEN];     // 数据指针
}SourcePacketStr; // 68Byte

/**
 * 加扰数据结构
*/
typedef struct disturb_packet_struct
{
    // uint8_t random_num;  // 随机数
    SourcePacketStr src_packet; // 源数据
}DisturbPacketStr; // 69Byte

/**
 * 转码数据结构
*/
typedef struct convert_packet_struct
{
	
    uint8_t cover_data[ONE_WIRE_COVERT_DATA_LEN];  // 数据
}ConvertPacketStr; // 92Byte

/**
 * 单总线数据包数据结构
*/
typedef struct one_wire_packet_struct
{
//    uint8_t sync_head[4];        超始位
    uint16_t len;         		// 长度
	struct FlagBody flag;
	uint16_t seriallumber;
	uint16_t remoteSeriallumber;
    ConvertPacketStr convert;   // 转码数据
//	uint16_t crc16_data;
//    uint16_t sync_end;           // 结束码
}OneWirePacketStr; // 96Byte

/**
 * 封包、解包操作指针
*/
#define ONE_WIRE_SOURCE_BUF_ADDR            5
#define ONE_WIRE_DISTURB_BUF_ADDR           5
#define ONE_WIRE_CONVERT_BUF_ADDR           5
#define ONE_WIRE_PACKET_BUF_ADDR            4

/*
 *  1. 链路层缓冲的是原始数据；
 *  2. 一个包最大支持64 Byte原始数据，队列本身消耗2Byte
 *  3. 队列存的所有数据都是：ReportID + Data数据格式；
*/

#define SEND_LONG_ONE_WIRE_BLOCK_QUEUE_LENGTH               108  /* 最大支持64Byte的源数据 */
#define SEND_LONG_ONE_WIRE_BLOCK_NUMBER                     3
#define SEND_SHORT_ONE_WIRE_BLOCK_QUEUE_LENGTH              64  /* 最大支持32Byte的源数据 */
#define SEND_SHORT_ONE_WIRE_BLOCK_NUMBER                    5

#define SEND_ACK_ONE_WIRE_BLOCK_QUEUE_LENGTH              24  /* 最大支持32Byte的源数据 */
#define SEND_ACK_ONE_WIRE_BLOCK_NUMBER                    2

#define REC_ONE_WIRE_BLOCK_QUEUE_LENGTH                     256  /* 最大支持64Byte的源数据 */
#define REC_ONE_WIRE_BLOCK_NUMBER                           5

#define SEND_SHORT_ONE_WIRE_DATA_MAX_LEN                    32
#define SEND_LONG_ONE_WIRE_DATA_MAX_LEN                     64

// 计算CRC-16 CCITT
unsigned short crc16_ccitt( unsigned char *data, unsigned short len); 

/**
 * @brief :单总线转输层协议初始化
 * 
 * @param 
 * @return true : 成功
 * @return false : 失败
 */
bool one_wire_bus_tra_init(void);

/**
 * @brief 1. 串口连续23uS(2 Byte对应时间)未收到数据，表示一帧接收完成，调用一次本函数。
 * @brief 2. 由于单总线协议规定了串口数据传输间隔，若芯片硬件不支持23uS串口超时中断，可用
 * @brief    定时器控制串口接收超时，可以超时 500mS 来实现。
 * @brief 3. 串口会接收到对方数据，也会接收到自已发送的数据，可能是一个包，也可能是多包接连，
 * @brief 4. 串口接收缓冲最大长度200 Byte
 * 
 * @param p_uart_data ：串口接收数据指针
 * @param rec_len ： 串口接收到的数据长度
 * 
 * @return 
 */
void one_wire_bus_tra_rec_callback(uint8_t *p_uart_data,uint16_t rec_len);

/**
 * @brief 单总线动行时钟基准，系统需要每0.5mS调用一次本函数
 */
void one_wire_bus_tra_timer_tick_process_0_5ms(void);

/* @brief 将要发送的数据、命令，转成标准格式，并写入队列
 * 
 * @param pdata : 要写入的数据，最大长度64Byte
 * @param len : 写入的数据长度
 * @param cmd : 要写入的命令字
 * @param serial : 流水号
 * @param f_irq_dis : 写入队列时是否关中断
 * 
 * @return true : 写入成功
 * @return false : 写入失败
 */
bool one_wire_bus_tra_write_long_frame_to_queue(uint8_t *pdata,uint8_t len,flagbody *flag_data,uint8_t serial,uint8_t remoteSerial,bool f_irq_dis);
bool one_wire_bus_tra_write_long_frame_to_queue_aaa(uint8_t *pdata,uint16_t len,flagbody *flag_data,uint16_t serial,uint16_t remoteSerial,bool f_irq_dis);
/* @brief 将要发送的数据、命令，转成标准格式，并写入队列
 * 
 * @param pdata : 要写入的数据，最大长度32Byte
 * @param len : 写入的数据长度
 * @param cmd : 要写入的命令字
 * @param serial : 流水号
 * @param f_irq_dis : 写入队列时是否关中断
 * 
 * @return true : 写入成功
 * @return false : 写入失败
 */
bool one_wire_bus_tra_write_short_frame_to_queue(uint8_t *pdata,uint16_t len,flagbody *flag,uint16_t serial,uint16_t remoteSerial,bool f_irq_dis);

bool one_wire_bus_tra_write_ack_frame_to_queue(uint8_t *pdata,uint16_t len,flagbody *flag_data,uint16_t serial,uint16_t remoteSerial,bool f_irq_dis);
/* @brief 从队列中读取数据、命令，并打包成一帧串口要发送的数据
 * 
 * @return uint8_t : 最终打包完成，需要串口发送的数据长度
 */
uint16_t one_wire_bus_tra_read_queue_pack_uart_frame(void);

/**
 * @brief 从串口中拆分出一帧单总线数据包，并作相应处理
 * 
 * @param p_udata_start ：一帧单总线数据包数据启始指针
 * @param p_udata_end ： 一帧单总线数据结束指针
 * 
 * @return true:操作成功  false:操作失败
 */
bool one_wire_bus_tra_analysis_rec_packet(uint8_t *p_udata_start,uint8_t *p_udata_end);

/**
 * @brief 检测自已接收到的数据，判断串口一个包是否发送成功
 *
 * @return
 */ 
void one_wire_bus_tra_one_frame_send_ok(void);

/**
 * @brief 调试命令收发
 */
#ifdef ENABLE_ONE_WIRE_DEBUG_FUNCTION
  bool one_wire_bus_tra_debug_function(void);
#endif


#endif
/* [] END OF FILE */
